perm filename MSSIO.OLD[NEW,LCS] blob sn#454338 filedate 1979-06-23 generic text, type T, neo UTF8
	TITLE MSSIO ; ********* JUN 8,74 *********
;;	INTERNAL GETFI2,FASTI2,LOOP
	INTERNAL GETFI2,FASTI2
	INTERNAL LOOK,LOOKD,LOOKF,PAC,UNPAC,LOOKX,LOOKL
	INTERNAL PUTEXT,EXTOUT,GETEXT,EXTIN,FINEXT
; WRITES AND READS DUMP MODE FILES WITH ANY EXTENSION.
	ENTRY TYPWRD,TYPSTR,TYPINT,TYPCRLF,TYPFLT,TYPCHR
;TYPES A WORD, STRING, CRLF, INTEGER, FLTING PT., TYPE CHAR STRING(WD CNT)


	CH3←13
	CH←12
	CH2←11
	BLKS←←=1

DEFINE ERROR (MSG)
<	JSA 16,.ERROR
	JUMP [ASCIZ/MSG/
]
>


REGS:	BLOCK 20
DIR:	BLOCK 4

;CALL PUTEXT(<FILE>,<EXT>)
PUTEXT:	0	;USES EXTOUT,FINEXT, CH2
	MOVE 0,@0(16)
	MOVEM 0,FILNAM
	MOVE 0,@1(16)
	MOVEM 0,EXTNAM
	JSA 16,INTFIL
	SETZM DIR+2
	SETZM DIR+3
	ENTER CH2,DIR
	ERROR <ENTER FAILED>
	JRA 16,2(16)

;CALL EXTOUT(<ARRAY>,<NO. OF WORDS>)

EXTOUT:	0
	HRRZ 0,0(16)
	SUBI 0,1
	MOVEM 0,COM
	MOVN 0,@1(16)
	HRLM 0,COM
	OUTPUT CH2,COM
	STATZ CH2,740000
	ERROR <WRITE ERROR>
	JRA 16,2(16)


INTFIL:	0	;INITS DSK 
	MOVEI REGS
	BLT REGS+3
	INIT CH2,17
	SIXBIT/DSK/
	0
	ERROR <CAN'T INIT DSK!>
INTF4:	MOVE 0,FILNAM#
	MOVEM 0,FN#
	MOVE 1,[POINT 7,FN]
INTF3:	MOVE 2,[POINT 6,DIR]
	SETZM DIR
	MOVEI 3,5
INTF1:	ILDB 0,1
	CAIN 0," "
	JRST INTF2
	SUBI 0,40
	IDPB 0,2
	SOJG 3,INTF1
INTF2:	HRLZI REGS
	BLT 3
	MOVE 0,EXTNAM#
	MOVEM 0,EX#
	MOVE 1,[POINT 7,EX]
EXTF3:	MOVE 2,[POINT 6,DIR+1]
	SETZM DIR+1
	MOVEI 3,5
EXTF1:	ILDB 0,1
	CAIN 0," "
	JRST EXTF2
	SUBI 0,40
	IDPB 0,2
	SOJG 3,EXTF1
EXTF2:	HRLZI REGS
	BLT 3
	JRA 16,0(16)


COM:	OCT 0,0
BLKNUM:	0

;CALL FINEXT
FINEXT:	0
	CLOSE CH2,0
	STATZ CH2,740000
	ERROR <ERROR AFTER CLOSE>
	RELEASE CH2,0
	JRA 16,0(16)

;CALL GETEXT(<FILE>,<EXT>)

GETEXT:	0
	MOVE 0,@0(16)
	MOVEM 0,FILNAM
	MOVE 0,@1(16)
	MOVEM 0,EXTNAM
	JSA 16,INTFX
	SETZM DIR+3
	SETZM DIR+2
	LOOKUP CH,DIR
	ERROR <LOOKUP FAILED>
	JRA 16,2(16)


INTFX:	0	;INITS DSK FOR INPUT
	MOVEI REGS
	BLT REGS+3
	INIT CH,17
	SIXBIT/DSK/
	0
	ERROR <CAN'T INIT DSK!>
	JRST INTF4


;CALL FASTI2(<ARRAY>,<NO. WORDS>)

EXTIN:	0
	HRRZ 0,0(16)
	SUBI 0,1
	MOVEM 0,COM
	MOVN 0,@1(16)
	HRLM 0,COM
	INPUT CH,COM
	STATZ CH,740000
	0
	JRA 16,2(16)
.ERROR:	0
	OUTSTR [ASCIZ/?
/]				;MAKE SURE HE CAN SEE HIS ERROR
	OUTSTR @(16)		;OUTPUT ERROR MESSAGE
	CALLI 1,12		;LET USER CONTINUE
	JRA 16,1(16)
;CALL GETFI2(<FILE>,<0 OR -1>)  0=DAT,LCS  -1=WHERE YOU ARE., -2=MSS,MUS(HELP)

GETFI2:	0
	MOVE 0,@0(16)
	MOVEM 0,FILNAM
	MOVE 0,@1(16)
	MOVEM 0,PPNW#
	JSA 16,INTFIZ
	MOVE 0,[SIXBIT/DMD/]
	MOVEM 0,DIR+1
GETFL:	JSA 16,LKUP
	SKIPA
	JRST GETF3
	SETZM DIR+1
	JSA 16,LKUP
	SKIPA
GETF3:	JRA 16,2(16)
	MOVEI 1
	MOVEM @1(16)	;SEND BACK A 1 IN 2ND ARGUMENT IF FILE NOT FOUND.
	JRA 16,2(16)

LKUP:	0
	SETZM DIR+2
	SETZM DIR+3
	SKIPE PPNW	;0=DAT,LCS    NON-ZERO = WHERE EVER YOU ARE
	JRST LUP
	MOVE 0,[SIXBIT/DATLCS/]
	JRST LUP3
LUP:	MOVN 0,PPNW
	CAIE 0,2	;-2=MSS,MUS
	JRST LUP2
     	MOVE 0,[SIXBIT/MSSMUS/]		
LUP3:	MOVEM 0,DIR+3		;PUTS AWAY THE PPN
LUP2:	LOOKUP CH3,DIR
	JRA 16,0(16)
	JRA 16,1(16)

INTFIZ:	0	;INITS DSK FOR INPUT
	MOVEI REGS
	BLT REGS+3
	INIT CH3,17
	SIXBIT/DSK/
	0
	ERROR <CAN'T INIT DSK!>
	JRST INTF4


;CALL FASTI2(<ARRAY>,<NO. WORDS>)

FASTI2:	0
	HRRZ 0,0(16)
	SUBI 0,1
	MOVEM 0,COM
	MOVN 0,@1(16)
	HRLM 0,COM
	INPUT CH3,COM
	STATZ CH3,740000
	0
	JRA 16,2(16)

;LOOK(<FILE>) FOR NO EXT., LOOKD() FOR .DAT, LOOKF() FOR .DMD, LOOKX FOR (.EXT)

LOOKX:	0
	MOVE	0,@1(16)
	MOVEM 	0,FILNAM
	JSA 16, INTFIQ
	MOVE 0,DIR
	JRST LOOK1
LOOKF:	0
	MOVSI 0,'DMD'
	JRST LOOK1
LOOKD:	0
	MOVSI 0,'DAT'
	JRST LOOK1
LOOK:	0
	MOVEI	0,0
LOOK1:	MOVEM	0,DIR+1
	MOVE	0,@(16)
	MOVEM 	0,FILNAM
	JSA 16, INTFIQ
	SETZM	DIR+2
	SETZM	DIR+3
	LOOKUP	CH,DIR
	TDZA	0,0
NPP:	MOVNI	0,1
	JRA 16,1(16)

LOOKL:	0
	MOVE	0,@(16)
	MOVEM 	0,FILNAM
	JSA 16, INTFIZ		;INIT DSK, CH3
	MOVSI 0,'LIB'
      	MOVEM	0,DIR+1
	SETZM	DIR+2
	GETPPN 0,
	MOVE 1,[SIXBIT/LIB   /]  ;FOR LIBRARY AREAS (FOR CODE 11)
	HLL 0,1
	MOVEM	DIR+3		;NOW PPN IS LIB,XXX WHERE XXX IS YOU.
	LOOKUP	CH3,DIR  	;NOW GET THE .LIB FILE ON YOUR AREA ONLY
	JRA 16,1(16)
;;	MOVNI	0,1
;;	JRA 16,1(16)
	JRST NPP

INTFIQ:	0	;INITS DSK FOR INPUT
	MOVEI REGS
	BLT REGS+3
	INIT CH,17
	SIXBIT/DSK/
	0
	HALT .-3
;	ERROR <CAN'T INIT DSK!>

;;INTF4:	MOVE 0,FILNAM#
;;	MOVEM 0,FN#
;;	MOVE 1,[POINT 7,FN]
	MOVE 1,[POINT 7,FILNAM#]
	MOVE 2,[POINT 6,DIR]
	SETZM DIR
	MOVEI 3,5
INTL1:	ILDB 0,1
;;	CAIN 0," "
;;	JRST INTF2
	SUBI 0,40
	IDPB 0,2
	SOJG 3,INTL1
INTL2:	JRST EXTF2

PAC:	0		;CALL PAC(PW,AR)
	HRRZ 4,1(16)	; ******* USES AC'S 4,5,6 ********
	ADDI 4,2
	HRR 5,@4	;SIZE IS 12 BITS
	LSHC 5,-10
	SOJ 4,
	HRR 5,@4
	LSHC 5,-16
	SOJ 4,
	HRR 5,@4
	LSHC 5,-16
	MOVEM 6,@0(16)
	JRA 16,2(16)
UNPAC:	0		;CALL UNPAC(PW,AR)
	HRRZ 1,1(16)
	ADDI 1,2
	MOVE 2,@0(16)
	LSHC 2,-10
	ASH 3,-34
	MOVEM 3,@1
	SOJ 1,
	LSHC 2,-16
	ASH 3,-26
	MOVEM 3,@1
	SOJ 1,
	LSHC 2,-16
	ASH 3,-26
	MOVEM 3,@1
	JRA 16,2(16)
	
TYPSTR:	0		;CALL TYPSTR(STRING)
	OUTSTR @(16)	;TYPES OUT A STRING
	JRA 16,1(16)  ;THIS WILL TYPE IN GROUPS OF 5 CHARS ALWAYS!!!

TYPCHR:	0		;CALL TYPCHR(STRING,CHAR COUNT)
	SKIPL 1,@1(16)
	JRST TYPCH2
	OUTSTR @(16)
TYPCH1:	JRA 16,2(16)
TYPCH2:	MOVSI 2,440700
	HRRI 2,@(16)
TYPCH3:	SOJL 1,TYPCH1
	ILDB 3,2
	OUTCHR 3
	JRST TYPCH3

TYPWRD:	0		;CALL TYPWRD(WORD)   ASSUMES ≤5 CHARS.
	MOVSI 2,440700
	HRRI 2,@(16)
	MOVEI 1,5
TYPWR1:	ILDB 3,2
	OUTCHR 3
	SOJG 1,TYPWR1
	JRA 16,1(16)

TYPCRLF:	0	;CALL TYPCRLF TYPES A CRLF
	OUTSTR [ASCIZ /
/]
	JRA 16,(16)

TYPINT:	0  		;CALL TYPINT(INTEGER)
	SKIPGE 1,@(16)	;TYPES OUT INTEGERS
	OUTCHR ["-"]
	MOVMS 1
	PUSHJ 17,DECREC
	JRA 16,1(16)
DECREC:	IDIVI 1,=10
	HRLM 2,(17)
	SKIPE 1
	PUSHJ 17,DECREC
	HLRZ 1,(17)
	ADDI 1,"0"
	OUTCHR 1
	POPJ 17,

TYPFLT:	0			;CALL TYPFLT(F)
	MOVM 4,@(16)	;NEEDS ACS 1→5  **** PRINTS ONLY TO 2 DECIS.
	KIFIX 3,@(16)
	FMPR 4,[100.0]		;TO GET THINGS TO RT. OF DEC.
;;*** CAUSES 199.997 TO PRINT AS 199 **	FADR 4,[0.5]		;FOR ROUND OFF.
	KIFIX 4,4
	IDIVI 4,=100		;REMAINDER IS IN AC6
	JUMPN 3,TYPFL1		;JUMP IF LFT SIDE .NE.0
	SKIPGE @(16)		;IS ORIGINAL NUM. NEG?
	OUTCHR ["-"]		;YES
	OUTCHR ["0"]
	JRST .+3		;PRINT A ZERO AND SKIP NEXT CALL
TYPFL1:	JSA 16,TYPINT
	JUMP 3
	SKIPN 5		;PRINT NO MORE IF ONLY ZEROS
	JRA 16,1(16)
	OUTCHR ["."]	;DECIMAL PT.
;;	CAIGE 5,=100
;;	OUTCHR["0"]	;FOR ZERO AFTER DECI
	CAIGE 5,=10 
	OUTCHR["0"]	;FOR  ZERO AFTER DECI
;;	MOVE 3,5
;;	IDIVI 3,=100
;;	JUMPE 4,DECI	;LOOK AT REMAINDER, JUMP IF NON-ZERO
	MOVE 3,5
	IDIVI 3,=10
	SKIPE 4      	;LOOK AT REMAINDER, JUMP IF NON-ZERO
	MOVE 3,5	;ELSE PRINT ALL 3 DIGITS
DECI:	JSA 16,TYPINT
	JUMP 3
	JRA 16,1(16)

	END